const log = require("./log");
const path = require("path");
const fs = require("fs");
const dayjs = require("dayjs");
const { fetchOne, update } = require("./db/query");
const useHelper = require("./helper");

const printer = require('win32-pdf-printer');

const taskConfig = {
    "isOpen": true,  // 是否开启任务
    "printing": false, // 是否正在打印
    "printId": null, // 当前打印任务ID
    "printTime": null, // 当前打印任务开始时间
    "taskWorkerId": null, // 定时任务ID
}

// 停止任务
function stopTask() {
    taskConfig.isOpen = false;
    taskConfig.printing = false;
    taskConfig.printId = null;
    taskConfig.printTime = null;
    if (taskConfig.taskWorkerId) {
        clearInterval(taskConfig.taskWorkerId);
        taskConfig.taskWorkerId = null;
    }
    log("打印任务已停止");
}

// 获取待打印任务
async function fetchPrintTasks() {
    try {
        // 获取所有等待打印的任务
        const waitingTask = await fetchOne('SELECT * FROM print_logs WHERE status = ? ORDER BY id ASC LIMIT 1', ['waiting']);
        if (waitingTask) {
            if (taskConfig.printing === false) {
                processPrintQueue(waitingTask);
            }
        }
    } catch (error) {
        log("获取打印任务失败：" + error.message);
        console.error("获取打印任务失败：", error);
    }
}

// 处理打印队列
async function processPrintQueue(printTask) {
    // 如果队列为空或已经在处理中，则返回
    // 标记为正在处理
    taskConfig.printing = true;
    taskConfig.printId = printTask.id;
    taskConfig.printTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
    // 公共打印参数
    const options = Object.assign({
        printerName:undefined,
        silent:true,
        landscape: true,
        printBackground: true,
        scale: 1, // 缩放比例
        scaleFactor: 100,
        color: true,
        dpi: 300,
        margins: {
            marginType: "none",
            top: 0,
            bottom: 0,
            left: 0,
            right: 0
        },
        pageSize: {
            width: printTask.width * 1000, // 单位：微米 (mm)
            height: printTask.height * 1000 // 单位：微米 (mm)
        }
    }, JSON.parse(printTask.printOptions))

    if(useHelper.APP_DEBUG){
        console.log("公共打印参数", options);
    }
    try {
        // 检查打印窗口是否可用
        if (global.PRINT_WINDOW == null || global.PRINT_WINDOW.isDestroyed()) {
            stopTask();
            return;
        }
        log(`开始处理打印任务: ID=${printTask.id}`);

        // 加载打印页面
        global.PRINT_WINDOW.loadURL(useHelper.BASE_APP_URL + `/html-print.html?id=${printTask.id}`);

        // 等待页面加载完成
        await new Promise((resolve) => {
            global.PRINT_WINDOW.webContents.once("did-finish-load", resolve);
        });

        // 给页面一点时间来渲染内容
        await new Promise(resolve => setTimeout(resolve, useHelper.store.get('waitRenderTime')));

        const pdfOptions = {
            landscape: options.landscape, // 使用横向打印以确保一行能显示两个标签
            printBackground: options.printBackground,
            scale: options.scale, // 缩放比例
            copies: 1,
            pageSize: options.pageSize,
            margins: options.margins,
            marginsType: 1, // 0 = default, 1 = none, 2 = minimum
            scaleFactor: options.scaleFactor,
            preferCSSPageSize: true, // 不使用CSS @page设置，强制使用我们指定的尺寸
            dpi: options.dpi,
        }
        if(useHelper.APP_DEBUG){
            console.log("pdfOptions:",pdfOptions)
        }
        // 生成PDF
        const pdfData = await global.PRINT_WINDOW.webContents.printToPDF(pdfOptions);
        // 保存PDF文件
        const outputDir = path.join(useHelper.UPLOAD_PATH, dayjs().format('YYYY-MM-DD'));
        // 确保目录存在
        if (!fs.existsSync(outputDir)) {
            fs.mkdirSync(outputDir, { recursive: true });
        }
        const date = dayjs().format('YYYY-MM-DD-HH-mm-ss');
        const filePath = path.join(outputDir, `${date}-${printTask.uuid}.pdf`);
        fs.writeFileSync(filePath, pdfData);

        // // 使用 webContents.print 打印
        const printOptions = {
            silent: options.silent, // 静默打印
            printBackground: options.printBackground, // 是否打印背景
            deviceName: options.printerName || undefined, // 打印机名称
            color: options.color, // 是否打印颜色
            margins: options.margins, //
            landscape: options.landscape, // 是否横向打印
            scaleFactor: options.scaleFactor || 100, // 打印缩放比例
            pagesPerSheet: options.pagesPerSheet || 1, // 每张纸的页数
            collate: options.collate || true, // 是否排序
            copies: options.copies || 1, // 打印份数
            pageRanges: options.pageRanges || {}, // 打印页数
            duplexMode: options.duplexMode || undefined, // 打印模式 simplex,shortEdge,longEdge
            dpi: options.dpi || 300, // 打印机DPI
            header: options.header || undefined, // 打印头
            footer: options.footer || undefined, // 打印尾
            pageSize: options.pageSize, // 打印纸张

        }
        if(useHelper.APP_DEBUG){
            console.log("printOptions.printAsync",printOptions)
        }
        await printAsync(printOptions);

        // 使用 win32-pdf-printer 打印
        // printer.print(filePath, {
        //     orientation: options.landscape === true ? 'landscape' : "portrait",
        //     paperSize: '40x30mm',
        //     printer: options.printerName, // 打印机名称
        //     silent: true, // 静默打印
        //     printBackground: true, // 是否打印背景
        //     color: true, // 是否打印颜色
        // });

        await update('UPDATE print_logs SET status = ? WHERE id = ?', ['success', printTask.id]);
        log("打印成功-", printTask.id);
        if (useHelper.APP_DEBUG) {
            console.log("打印成功-", printTask.id);
        }
    } catch (error) {
        log(`打印任务执行失败- ${printTask.id} : `, error.message);
        if (useHelper.APP_DEBUG) {
            console.error(`打印任务执行失败- ${printTask.id} : `, error);
        }
        // 更新打印状态为失败
        await update('UPDATE print_logs SET status = ?, errorMessage = ? WHERE id = ?', ['failed', error.message, printTask.id]);
    } finally {
        // 处理完成，重置处理状态
        taskConfig.printing = false;
        taskConfig.printId = null;
        taskConfig.printTime = null;
    }
}


const printAsync = (printOptions) => {
    return new Promise((resolve, reject) => {
        global.PRINT_WINDOW.webContents.print(printOptions, (success, errorType) => {
            if (success) {
                resolve();
            } else {
                reject(new Error(`打印失败: ${errorType}`));
            }
        });
    });
};


// 主任务函数
async function startTask() {
    if (!taskConfig.isOpen) {
        return;
    }
    if (taskConfig.taskWorkerId) {
        return;
    }
    log("startTask", taskConfig.isOpen)
    taskConfig.taskWorkerId = setInterval(async () => {
        try {
            // 获取并处理打印任务
            await fetchPrintTasks()
        } catch (error) {
            log("任务执行失败：" + error.message);
            console.error("任务执行失败：", error);
        } finally {

        }
    }, 500);

}

module.exports = {
    taskConfig,
    startTask,
    stopTask
}









